package cn.com.zhaoweiping.ie.convert;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ClassUtil;
import com.alibaba.excel.converters.Converter;
import com.google.common.collect.Lists;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;

/**
 * 获取所有的转换器<br>
 *
 * @author 冰羽
 * @version 2.2.0
 */
@Slf4j
public class ConverterRegister {
  private static final List<Converter> converters = Lists.newArrayList();

  public static List<Converter> list(String pk, Class<? extends Converter> clazz) {
    Set<Class<?>> set = ClassUtil.scanPackageBySuper(pk, clazz);
    Lists.newArrayList(set)
        .forEach(
            item -> {
              try {
                // 抽象类/接口 不注册
                if (Modifier.isInterface(item.getModifiers()) == false
                    && Modifier.isAbstract(item.getModifiers()) == false) {

                  register((Converter) item.newInstance());
                }
              } catch (Exception e) {
                log.error(String.format("%s - newInstance - %s", item.getName(), e));
              }
            });

    return converters;
  }

  public static List<Converter> register(Converter... converterArray) {
    if (ArrayUtil.isNotEmpty(converterArray)) {
      for (Converter converter : converterArray) {
        return register(converter);
      }
    }

    return converters;
  }

  public static List<Converter> register(Converter converter) {
    if (converter == null) {
      return converters;
    }

    List<Converter> v =
        converters.stream()
            .filter(item -> item.getClass().getName().equals(converter.getClass().getName()))
            .collect(Collectors.toList());

    if (CollectionUtil.isEmpty(v)) {
      converters.add(converter);
    }

    return converters;
  }

  public static Converter getConverter(Class<?> clazz) {
    List<Converter> list =
        converters.stream()
            .filter(
                item ->
                    clazz != null
                        && item != null
                        && item.supportJavaTypeKey() != null
                        && clazz.getName().equals(item.supportJavaTypeKey().getName()))
            .collect(Collectors.toList());

    if (CollectionUtil.isNotEmpty(list)) {
      return list.stream().findFirst().get();
    } else {
      return null;
    }
  }
}
